import axios from 'axios';
import JSONbig from 'json-bigint';
import Cookie from "js-cookie";
import {Message} from 'element-ui';
import fileDownload from "js-file-download";

const instance = axios.create({
    baseURL: '/api',
    timeout: 5000
})

instance.interceptors.request.use(
    function (config) {
        // 在请求发出之前进行处理
        const token = Cookie.get("token");
        const userId = Cookie.get("userId");
        //config.headers.Authorization = 'Bearer ' + getToken()
        config.headers.token = token;
        config.headers.userId = userId;

        // 设置 transformResponse 处理逻辑
        if (config.responseType !== 'blob') {
            config.transformResponse = [data => {
                try {
                    return JSONbig.parse(data, null);
                } catch (e) {
                    console.error('JSONbig 解析失败', e);
                    return data;
                }
            }];
        } else {
            // 对于文件下载请求，不使用 JSONbig 解析
            config.transformResponse = [data => data];
        }

        return config
    },
    function (error) {
        // 对请求错误做些什么
        return Promise.reject(error)
    }
)

instance.interceptors.response.use(
    function (response) {
        // 如果是文件下载请求，直接返回整个 response 对象
        if (response.config.responseType === 'blob') {
            return response;
        }
        // 否则，继续解析响应数据
        return response.data;
    },
    function (error) {
        // 对请求错误做些事情
        Message({
            message: '系统繁忙，请稍后再试',
            type: 'error',
            duration: 5000
        })
        return Promise.reject(error)
    }
)

export default {
    get: function (url, params, config = {}) {
        return instance.get(url, {
            params: params,
            timeout: config.timeout // 允许覆盖默认超时
        })
    },

    post: function (url, data, config = {}) {
        return instance.post(url, data, {
            timeout: config.timeout // 允许覆盖默认超时
        })
    },

    upload: function (url, formData, config = {}) {
        return instance.post(url, formData, {
            headers: {
                'Content-Type': 'multipart/form-data'
            },
            timeout: config.timeout // 允许覆盖默认超时
        })
    },

    //下载文件
    download: function (url, params, config = {}) {
        return instance.get(url, {
            params: params,
            responseType: 'blob', // 设置响应类型为 blob
            timeout: config.timeout // 允许覆盖默认超时
        }).then((response) => {
            // 获取 Content-Disposition 头，并处理可能的大小写问题
            const contentDisposition = response.headers['content-disposition'];
            let fileName = ''; // 默认文件名

            if (contentDisposition) {
                const matches = contentDisposition.match(/filename=["']?([^"'\r\n]+)["']?/);
                if (matches && matches[1]) {
                    try {
                        // 尝试解码文件名，处理 URL 编码和非 ASCII 字符
                        fileName = decodeURIComponent(matches[1].trim());
                    } catch (e) {
                        fileName = matches[1].trim();
                    }
                }
            }

            // 确保传递给 fileDownload 的是 Blob 数据
            fileDownload(response.data, fileName); // 使用 js-file-download 下载文件

            Message({
                message: "下载成功",
                type: 'success',
                duration: 600 // 设置显示时间为 600 毫秒（0.6 秒）
            });
        }).catch((error) => {
            console.error('Download request failed:', error); // 打印完整的错误信息到控制台

            Message({
                message: error && error.response ?
                    (error.response.data && error.response.data.message) ||
                    error.response.statusText :
                    error.message || '下载失败',
                type: 'error',
                duration: 5000
            });
        });
    }
}
